#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#ifdef Test1// 不定参宏函数
#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__); // 文件名、行号
                                                                                // ##表示可以允许Log("123");
int main()
{
    // printf("%s - %d\n","肯德基", 123);
    // printf("[%s:%d] %s - %d\n",__FILE__,__LINE__,"肯德基", 123);// 文件名、行号
    // 2.定义宏
    LOG("%s-%d\n", "肯德基", 213);

    return 0;
}
#endif



//#define Test2
#ifdef Test2//C 语言不定参数的访问
void PrintNum(int count, ...)
{
    va_list ap;
    va_start(ap, count); // 获取conut参数之后的第一个参数的起始地址。也就是...的第一个参数地址

    for (int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int);
        printf("param[%d]:%d\n", i, num);//printf的%d格式注定了要传入确定的数据类型
    }
    va_end(ap);//ap指针置空
}

void myPrintf(const char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    char* res;
    int n = vasprintf(&res, fmt, ap);
    if(n != -1)//成功
    {
        printf(res);
        free(res);
    }
    va_end(ap);
}
int main()
{
    PrintNum(2,123,432);
    PrintNum(6,2,3,4,5,6,7);

    myPrintf("%s - %d \n", "肯德基", 1111);
    return 0;
}
#endif
// 接口：
// va_start


